import numpy as np
import pandas as pd
import matplotlib.pyplot as plt #导入matplotlib画图工具箱
import seaborn as sns #导入seaborn画图工具箱

# 深度神经网络：处理非结构化，超高维度特征问题，减少特征工程

# 深度学习的机理：
# 用一串一串的函数，也就是层，堆叠起来，作用于输入数据，进行从原始数据到分类结果的过滤和提纯
# 这些层通过权重来参数化，通过损失函数来判断当前网络的效能，然后通过优化器来调整权重，寻找从输入到输出的最佳函数
# Sigmiod函数，逻辑回归函数，神经网络激活函数
def deep_neural_network_bank_customer():
    df_bank = pd.read_csv("BankCustomer.csv")  # 读取文件
    df_bank.head()  # 显示文件前5行

    # 显示不同特征的分布情况
    features = ['City', 'Gender', 'Age', 'Tenure',
                'ProductsNo', 'HasCard', 'ActiveMember', 'Exited']
    fig = plt.subplots(figsize=(15, 15))
    for i, j in enumerate(features):
        plt.subplot(4, 2, i + 1)
        plt.subplots_adjust(hspace=1.0)
        sns.countplot(x=j, data=df_bank)
        plt.title("No. of costumers")
    plt.show()

    # 针对数据集做清理：
    # 1.性别： 特征进行二元处理；0/1代码格式
    # 2.城市：多个二元类别哑变量
    # 3.姓名：与流失与否完全无关，忽略该特征

    # 把二元类别文本数字化
    df_bank['Gender'].replace("Female", 0, inplace=True)
    df_bank['Gender'].replace("Male", 1, inplace=True)
    # 显示数字类别
    print("Gender unique values", df_bank['Gender'].unique())
    # 把多元类别转换成多个二元哑变量，然后贴回原始数据集
    d_city = pd.get_dummies(df_bank['City'], prefix="City")
    df_bank = [df_bank, d_city]
    df_bank = pd.concat(df_bank, axis=1)
    # 构建特征和标签集合
    y = df_bank['Exited']
    X = df_bank.drop(['Name', 'Exited', 'City'], axis=1)
    print(X.head())  # 显示新的特征集



if __name__ == '__main__':
    deep_neural_network_bank_customer()
